﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using METODESA.Server.Data.Exceptions;
using METODESA.Server.Data.METODESA.Entity;
using NHibernate;

namespace METODESA.Server.Data.METODESA.Nhibernate
{
    public class ReportesDao : BaseDao
    {

        public static IList ClientesFrecuentes(int maxRows) //Clientes mas frecuentes
        {
            try
            {
                myISession = NHibernateHelper.GetCurrentSession(); //se obtiene la sesion

                String queryString1 = "select ov.Cliente.Id,count(ov.Cliente.Id) from OrdenVenta as ov group by ov.Cliente.Id order by count(ov.Cliente.Id) desc";

                IQuery query=myISession.CreateQuery(queryString1).SetMaxResults(maxRows); // Los 5 que mas compran
                IList a=query.List();
                
                return a;  //se ejecuta el query
            }
            catch (Exception e)
            {
                throw new ClienteNotExistsException("There's no cliente");
                return null;
            }
        }


        public static IList ProductosFrecuentes(int maxRows) // Productos más frecuentes
        {
            try
            {
                myISession = NHibernateHelper.GetCurrentSession(); //se obtiene la sesion

                String queryString1 ="select dv.Producto.Id,sum(dv.Cantidad) from DetalleVenta as dv group by dv.Producto.Id order by sum(dv.Cantidad) desc";

                IQuery query = myISession.CreateQuery(queryString1).SetMaxResults(maxRows); // Los x que mas compran
                IList a = query.List();

                return a;  //se ejecuta el query
            }
            catch (Exception e)
            {
                throw new ProductoNotExistsException("There's no producto");
                return null;
            }
        }


        public static IList VendedoresFrecuentes(int maxRows) //Vendedores más frecuentes
        {
            try
            {
                myISession = NHibernateHelper.GetCurrentSession(); //se obtiene la sesion

                String queryString1 = "select ov.Empleado.Id,count(ov.Empleado.Id) from OrdenVenta as ov group by ov.Empleado.Id order by count(ov.Empleado.Id) desc";

                IQuery query = myISession.CreateQuery(queryString1).SetMaxResults(maxRows); // Los x que mas compran
                IList a = query.List();

                return a;  //se ejecuta el query
            }
            catch (Exception e)
            {
                throw new EmpleadoNotExistsException("There's no empleado");
                return null;
            }
        }


        public static IList ProductosMasComprados(int maxRows) //Productos mas Comprados
        {
            try
            {
                myISession = NHibernateHelper.GetCurrentSession(); //se obtiene la sesion

                String queryString1 = "select dc.Producto.Id,sum(dc.Cantidad) from DetalleCompra as dc group by dc.Producto.Id order by sum(dc.Cantidad) desc";

                IQuery query = myISession.CreateQuery(queryString1).SetMaxResults(maxRows); // Los x que mas compran
                IList a = query.List();

                return a;  
            }
            catch (Exception e)
            {
                throw new ProductoNotExistsException("There's no producto mas comprado");
                return null;
            }
        }



        public static IList ProveedoresFrecuentes(int maxRows) // Proveedores más Frecuentes
        {
            try
            {
                myISession = NHibernateHelper.GetCurrentSession(); //se obtiene la sesion

                String queryString1 = "select oc.Proveedor.Id,count(oc.Proveedor.Id) from OrdenCompra as oc group by oc.Proveedor.Id order by count(oc.Proveedor.Id) desc";

                IQuery query = myISession.CreateQuery(queryString1).SetMaxResults(maxRows); // Los x que mas compran
                IList a = query.List();

                return a;  //se ejecuta el query
            }
            catch (Exception e)
            {
                throw new ProveedorNotExistsException("There's no proveedor fecuentes");
                return null;
            }
        }


        public static IList<Proveedor> ProveedorPorMes(string mes, string ano) //Proveedores por Mes
        {
            try
            {
                myISession = NHibernateHelper.GetCurrentSession(); //se obtiene la sesion

                String queryString1 = "select distinct oc.Proveedor from OrdenCompra as oc where oc.Fecha like '%/";

                queryString1 +=mes;
                queryString1 +="/";
                queryString1 +=ano;
                queryString1 +="'";
                    
                //se forma el query

                return  myISession.CreateQuery(queryString1).List<Proveedor>();  //se ejecuta el query
            }
            catch (Exception e)
            {
                throw new ProveedorNotExistsException("There's no proveedor by the provided date");
                return null;
            }
        }


        public static IList ClientesConMasReparaciones(int maxRows)  //Clientes con mas Servicios
        {
            try
            {
                myISession = NHibernateHelper.GetCurrentSession(); //se obtiene la sesion

                String queryString1 = "select ov.Cliente.Id,count(ov.Cliente.Id) from OrdenVenta as ov,Servicio as ser where ser.ordenVenta.Cliente.Id=ov.Cliente.Id group by ov.Cliente.Id order by count(ov.Cliente.Id) desc";

                IQuery query = myISession.CreateQuery(queryString1).SetMaxResults(maxRows); // Los x que mas compran
                IList a = query.List();

                return a;  //se ejecuta el query
            }
            catch (Exception e)
            {
                throw new ClienteNotExistsException("There's no cliente con mas reparaciones");
                return null;
            }
        }


    }
}
